## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
import sys

import Options


def set_options(opt):
    opt.add_option('--high-precision-as-double',
                   help=('Whether to use a double floating point'
                         ' type for high precision time values'
                         ' WARNING: this option only has effect '
                         'with the configure command.'),
                   action="store_true", default=False,
                   dest='high_precision_as_double')


def configure(conf):
    if Options.options.high_precision_as_double:
        conf.define('USE_HIGH_PRECISION_DOUBLE', 1)
        conf.env['USE_HIGH_PRECISION_DOUBLE'] = 1
        highprec = 'long double'
    else:
        conf.env['USE_HIGH_PRECISION_DOUBLE'] = 0
        highprec = '128-bit integer'

    conf.check_message_custom('high precision time', 'implementation', highprec)

    conf.check(header_name='stdint.h', define_name='HAVE_STDINT_H')

    conf.check(header_name='inttypes.h', define_name='HAVE_INTTYPES_H')

    conf.check(header_name='sys/inttypes.h', define_name='HAVE_SYS_INT_TYPES_H')

    conf.write_config_header('ns3/simulator-config.h', top=True)

    if not conf.check(lib='rt', uselib='RT', define_name='HAVE_RT'):
        conf.report_optional_feature("RealTime", "Real Time Simulator",
                                     False, "librt is not available")
    else:
        conf.report_optional_feature("RealTime", "Real Time Simulator",
                                     conf.env['ENABLE_THREADING'],
                                     "threading not enabled")
        conf.env["ENABLE_REAL_TIME"] = conf.env['ENABLE_THREADING']


def build(bld):
    sim = bld.create_ns3_module('simulator', ['core'])
    sim.source = [
        'high-precision.cc',
        'time.cc',
        'event-id.cc',
        'scheduler.cc',
        'list-scheduler.cc',
        'map-scheduler.cc',
        'heap-scheduler.cc',
        'calendar-scheduler.cc',
        'ns2-calendar-scheduler.cc',
        'event-impl.cc',
        'simulator.cc',
        'default-simulator-impl.cc',
        'timer.cc',
        'watchdog.cc',
        'synchronizer.cc',
        'make-event.cc',
        ]

    headers = bld.new_task_gen('ns3header')
    headers.module = 'simulator'
    headers.source = [
        'high-precision.h',
        'nstime.h',
        'event-id.h',
        'event-impl.h',
        'simulator.h',
        'simulator-impl.h',
        'default-simulator-impl.h',
        'scheduler.h',
        'list-scheduler.h',
        'map-scheduler.h',
        'heap-scheduler.h',
        'calendar-scheduler.h',
        'ns2-calendar-scheduler.h',
        'simulation-singleton.h',
        'timer.h',
        'timer-impl.h',
        'watchdog.h',
        'synchronizer.h',
        'make-event.h',
        ]

    env = bld.env_of_name('default')
    if env['USE_HIGH_PRECISION_DOUBLE']:
        sim.source.extend([
            'high-precision-double.cc',
            ])
        headers.source.extend([
            'high-precision-double.h',
            ])
    else:
        sim.source.extend([
            'high-precision-128.cc',
            'cairo-wideint.c',
            ])
        headers.source.extend([
            'high-precision-128.h',
            'cairo-wideint-private.h',
            ])

    if env['ENABLE_REAL_TIME']:
        headers.source.extend([
                'realtime-simulator-impl.h',
                'wall-clock-synchronizer.h',
                ])
        sim.source.extend([
                'realtime-simulator-impl.cc',
                'wall-clock-synchronizer.cc',
                ])
        sim.uselib = 'RT'


